package KetNoiSQL;

import java.io.FileInputStream;
import java.sql.CallableStatement;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.Properties;
import java.util.Vector;
import javax.swing.JOptionPane;

public class KetNoiSQL {

    private static Connection ketNoi = null;
    public static Connection layKetNoi() {
        return ketNoi;
    }
    

    public KetNoiSQL() {
        if (ketNoi == null) {
            try {

                Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");// Đăng ký trình điều khiển
            } catch (ClassNotFoundException e) {
                JOptionPane.showMessageDialog(null, "Không tìm thấy Driver cho SQLServer.", "Thông Báo Lỗi", JOptionPane.ERROR_MESSAGE);
                e.printStackTrace();
            }
            try {
                String url = this.layThongTinSQLServer();
                //Tạo kết nối thông qua url
                ketNoi = DriverManager.getConnection(url);//Tự động lựa chọn trình điều khiển phù hợp và kết nối vào CSDL

            } catch (SQLException e) {
                JOptionPane.showMessageDialog(null, "Không thể kết nối với CSDL.", "Thông Báo Lỗi", JOptionPane.ERROR_MESSAGE);
                e.printStackTrace();
            }
        }
    }

    public static String layThongTinSQLServer() {
        Properties p = new Properties();
        try {
            FileInputStream kn = new FileInputStream("KetNoi.cfg");
            p.load(kn);
        } catch (Exception e) {
            return "";
        }
        String server = p.getProperty("ServerID");
        String cong = p.getProperty("Cong");
        String tenCSDL = p.getProperty("TenCSDL");
        String tenDangNhap = p.getProperty("TenDangNhap");
        String matKhau = p.getProperty("MatKhau");

        return "jdbc:sqlserver://" + server + ":" + cong
                + ";databaseName=" + tenCSDL
                + ";User=" + tenDangNhap
                + ";Password=" + matKhau;

    }
        //Hàm thực thi câu lệnh Select lấy dữ liệu từ CSDL,trả về 1 ResultSet
    public static ResultSet thucHienTruVan(String spTenThuTuc) throws SQLException {
        if (ketNoi != null) {
            CallableStatement cs = ketNoi.prepareCall("{call " + spTenThuTuc + "}");//Câu lệnh gọi thực thi Store Procedure trong SQL,Store Procedure không có tham số
            return cs.executeQuery();//Trả kết quả ra ngoài
        }
        return null;
    }
        //dùng Vector để lưu mảng danh sách các tham số,tham số ở đây có thể là kiểu int,String,float ....
    public static ResultSet thucHienTruVan(String spTenThuTuc, Vector danhSachThamSo) throws SQLException {
        if (ketNoi != null) {
            String strQ = "{call " + spTenThuTuc + "(";//gọi Store Procedure có tham số ,tham số được truyền vào như kiểu Int,String,float....
            int t = 0;
            for (Object obj : danhSachThamSo) {   //Dùng vòng lặp for each để duyệt qua Vector kiểm tra xem tham số ở kiểu gì rồi truyền tham số vào Store Procedure 
                if (t != 0) {
                    strQ += ",";// tham số cách nhau bởi dấu phẩy
                }
                if (obj instanceof Integer) {
                    Integer i = (Integer) obj;
                    strQ += i.toString();
                } else if (obj instanceof String) {
                    String s = (String) obj;
                    strQ += "N'" + s + "'"; // truyền tham số vào
                }
                t++;
            }
            strQ += ")}"; //đóng câu lệnh gọi ST

            CallableStatement cst = ketNoi.prepareCall(strQ);//CallableStatement để gọi các stored procedure
            return cst.executeQuery();
        }
        return null;
    }

    public static int thucHienCapNhat(String spTenThuTuc, Vector danhSachThamSo) throws SQLException {
        if (ketNoi != null) {
            String strQ = "{call " + spTenThuTuc + "(";
            int t = 0;
            for (Object obj : danhSachThamSo) {
                if (t != 0) {
                    strQ += ",";
                }
                if (obj instanceof Integer) {
                    Integer i = (Integer) obj;
                    strQ += i.toString();
                } else if (obj instanceof Float) {
                    Float f = (Float) obj;
                    strQ += f.toString();
                } else if (obj instanceof String) {
                    String s = (String) obj;
                    strQ += "N'" + s + "'";
                }
                t++;
            }
            strQ += ")}";
            CallableStatement cst = ketNoi.prepareCall(strQ);
            return cst.executeUpdate();
        }
        return -1;
    }
}
